var let 和const 的区别
let不能在定义之前访问访问该变量,但是var可以。即let必须先定义再使用,而var则可以,只是var未定义使用,其值为underfined。
console.log(x) // underfined
var x = 3 // 即使这里给x赋值,但是先使用的话,默认都认为是undefined
let 和 const都是块级作用域 看一道很经典的题目吧
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, 0);
}
for (let j = 0; j < 5; j++) {
setTimeout(() => {
console.log(j)
}, 0);
}
第一个循环的输出全都是5,而第二个的数是从0-4 为啥呢? 第一个是用的var来定义一个变量,第二个用的是let。 而且定时器是一个宏任务,会在循环结束之后才执行,这个循环结束之后的i的值是5,那么就会循环五次5, 第二个同理,但是此时的j在for循环中形成了一个块级作用域,所以每次输出的值,都是单次循环中j的值。
const和let的区别,let定义的值可以被重复改变,const的不可以,这个涉及到了Object.freeze之类的问题,将这个变量冻结起来,不能被改变,但如果他是一个对象的话,可以改变对象中的值。 可以看看这一篇
对象属性的get和set
const obj = {
name:'cxwht',
get name(){
return 'thwxc'
}
}
console.log(obj.name) // "thwxc"
每一个属性都可以有自己的get和set方法,get就是当这个属性被RHS(右查询)的时候执行的函数,并且给出返回值,简单来说就是读取这个属性的时候,那么set,就是给这个属性LHR的时候,执行的操作,我们可以用这个来模拟一下const,即 给一个属性set值的时候,抛出一个错误,并且get值不变即可
const obj = {
name:'cxwht',
get name(){
return 'thwxc'
},
set name(v) {
throw new Error('Don't set this number')
}
}
obj.name = 1 // Uncaught Error: Don't set this number
console.log(obj.name) // "thwxc"